namespace Spring.Expressions.Parser.antlr
{
	/* ANTLR Translator Generator
	 * Project led by Terence Parr at http://www.jGuru.com
	 * Software rights: http://www.antlr.org/license.html
	 */

	//
	// ANTLR C# Code Generator by Micheal Jordan
	//                            Kunle Odutola       : kunle UNDERSCORE odutola AT hotmail DOT com
	//                            Anthony Oguntimehin
	//

    using StringBuilder 	= System.Text.StringBuilder;
	using AST 				= antlr.collections.AST;

	public abstract class ParseTree : BaseAST
	{
		/// <summary>
		/// Walk parse tree and return requested number of derivation steps.
		/// If steps less-than 0, return node text.  If steps equals 1, return derivation
		/// string at step.
		/// </summary>
		/// <param name="step">derivation steps</param>
		/// <returns></returns>
		public string getLeftmostDerivationStep(int step) 
		{
			if ( step <= 0 ) 
			{
				return ToString();
			}
			StringBuilder buf = new StringBuilder (2000);
			getLeftmostDerivation(buf, step);
			return buf.ToString();
		}

		public string getLeftmostDerivation(int maxSteps)
		{
			StringBuilder buf = new StringBuilder(2000);
			buf.Append("    " + this.ToString());
			buf.Append("\n");
			for (int d=1; d < maxSteps; d++) 
			{
				buf.Append(" =>");
				buf.Append(getLeftmostDerivationStep(d));
				buf.Append("\n");
			}
			return buf.ToString();
		}

		/// <summary>
		/// Get derivation and return how many you did (less than requested for
		/// subtree roots.
		/// </summary>
		/// <param name="buf">string buffer</param>
		/// <param name="step">derivation steps</param>
		/// <returns></returns>
		protected internal abstract int getLeftmostDerivation(StringBuilder buf, int step);

		// just satisfy BaseAST interface; unused as we manually create nodes

		public override void initialize(int i, string s) 
		{
		}
		
		public override void initialize(AST ast) 
		{
		}
		
		public override void initialize(IToken token) 
		{
		}
	}
}
